package top.bugger168.cache_task_email_msg_admin.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import top.bugger168.cache_task_email_msg_admin.entity.SMSCode;
import top.bugger168.cache_task_email_msg_admin.service.SMSCodeService;
import top.bugger168.cache_task_email_msg_admin.util.CodeUtils;
@Service
@Slf4j
public class ISMSCodeService implements SMSCodeService {
    @Autowired
    private CodeUtils codeUtils;

    @Override
    @CachePut(value = "smsCode", key = "#tele")
    public String sendCodeToSMS(String tele) {
        // 这个方法只往缓存里存验证码
        return codeUtils.generator(tele);
    }

    @Override
    public boolean checkCode(SMSCode smsCode) {
        String code = smsCode.getCode();
        // 取缓存值,无值置空
        String cacheCode = codeUtils.get(smsCode.getTele());
        log.info("cache:" + cacheCode);
        return code.equals(cacheCode);
    }
    // 不能在本类中直接写方法取用缓存数据
    // spring注解的实现原理是被调用的时候代理对象发现有注解就会生成一些代码块从而实现注解的功能
    // 但是bean内方法使用内置方法不需要调用外部bean就轮不到spring来管,就没法根据方法上的注解进行插手
    // 说白了注解功能的实现要靠spring的bean管
    // 但是同一个bean中的方法互相调用不用经过spring,没有了spring的代理就无法识别Cacheable注解,退化成普通方法
//    @Cacheable(value = "smsCode",key = "#tele")
//    public String get(String tele){
//        return null;
//    }

}
